//
//  DMYMainController.swift
//  swiftWB
//
//  Created by mongyuan on 16/8/10.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

class DMYMainController: UITabBarController {

    // MAKE: - 懒加载属性
    private lazy var pushButton : UIButton = UIButton(imageName: "tabbar_compose_icon_add", bgImageName: "tabbar_compose_button")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        

        setUpPushButton()
    
        
    
    
    
    
    }
    
}

extension DMYMainController {
    
    private func setUpPushButton() {
        // 1.将发布按钮添加到tabbar上
        tabBar.addSubview(pushButton)
        
        // 2.设置位置
        pushButton.center = CGPointMake(tabBar.center.x, tabBar.bounds.size.height * 0.5)
        
        // 3.监听发布按钮的点击
        pushButton.addTarget(self, action: #selector(DMYMainController.pushBtnClicked), forControlEvents: .TouchUpInside)
        
        
    }
    
}

extension DMYMainController {
    
    // 事件监听本质是发送消息，但是发送消息是oc中的特性
    // 将方法包装成@SEL --> 类中查找方法列表--> 根据@SEL找到imp指针（函数指针）--> 执行函数
    // 如果swift中将一个函数声明成private，那么该函数不会被添加到方法列表中
    // 如果在private前面加上@objc，那么该方法依然会添加到方法列表中
    @objc private func pushBtnClicked() {
        print("clicked")
    }
    
}










/*纯代码初始化项目
 //        addChileViewControllers("DMYHomeViewController", title: "首页", image: "tabbar_home")
 //        addChileViewControllers("DMYMessageViewController", title: "消息", image: "tabbar_message_center")
 //        addChileViewControllers("DMYDiscoverViewController", title: "发现", image: "tabbar_discover")
 //        addChileViewControllers("DMYProfileViewController", title: "我", image: "tabbar_profile")
 
 
 // 1.获取json文件的路径
 guard let jsonPath = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil) else {
 
 print("么有获取到对应的文件路径")
 return
 
 }
 
 // 2.读取json文件中的内容
 guard let jsonData = NSData(contentsOfFile: jsonPath) else {
 print("没有获取到json文件中数据")
 return
 }
 
 
 // 3.将Data转成数组
 // 如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常.如果一个方法会抛出异常,那么需要对该异常进行处理
 /*
 在swift中提供三种处理异常的方式
 方式一:try方式 程序员手动捕捉异常
 do {
 try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
 } catch {
 // error异常的对象
 print(error)
 }
 
 方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象
 guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
 return
 }
 
 方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)
 let anyObject = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
 */
 guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
 return
 }
 
 guard let dictArray = anyObject as? [[String : AnyObject]] else {
 return
 }
 
 // 4.遍历字典，获取对应的信息
 for dict in dictArray {
 // 4.1获取控制器的对应的字符串
 guard let name = dict["vcName"] as? String else {
 continue
 }
 
 // 4.2获取控制器显示的title
 guard let title = dict["title"] as? String else {
 continue
 }
 
 // 4.3获取控制器显示的图标名称
 guard let imageName = dict["imageName"] as? String else {
 continue
 }
 
 // 4.4添加子控制器
 addChileViewControllers(name, title: title, image: imageName)
 }
 
 }
 
 // swift 支持方法的重载
 // 方法的重载：方法名称相同，但是参数不同  ----> 1.参数类型不同  2.参数个数不同
 // private修饰的在当前文件中可以访问到，而其他文件不能够访问
 /*
 private func addChileViewControllers(childVC: UIViewController, title: String, image: String) {
 
 // 1.设置子控制器的属性
 childVC.title = title
 childVC.tabBarItem.image = UIImage(named: image)
 childVC.tabBarItem.selectedImage = UIImage(named: image + "_highlighted")
 
 // 2.包装成导航控制器
 let navVC = UINavigationController(rootViewController: childVC)
 
 // 3.添加控制器
 addChildViewController(navVC)
 
 }
 */
 
 private func addChileViewControllers(childVcName: String, title: String, image: String) {
 
 // 0.获取命名空间
 guard let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as? String else{
 
 print("没有获取到命名空间")
 return
 }
 
 
 // 1.根据字符串获取到对应的Class
 guard let childVcClass = NSClassFromString(nameSpace + "." + childVcName) else {
 
 print("没有获取到字符串对应的Class")
 return
 
 }
 
 // 2.将对应的AnyObject转成控制器类型 as? 转成
 guard let childVcType = childVcClass as? UIViewController.Type else {
 
 print("没有获取到对应的控制器的类型")
 return
 
 }
 
 // 1.设置子控制器的属性
 let childVC = childVcType.init()
 
 childVC.title = title
 childVC.tabBarItem.image = UIImage(named: image)
 childVC.tabBarItem.selectedImage = UIImage(named: image + "_highlighted")
 
 // 2.包装成导航控制器
 let navVC = UINavigationController(rootViewController: childVC)
 
 // 3.添加控制器
 addChildViewController(navVC)
 
 }
 */
